#!/usr/bin/tclsh
#
# Generate multirotor mixer scale tables compatible with the ArduCopter layout
#

proc rad {a} { expr ($a / 360.0) * 2 * acos(-1) }
proc rcos {a} { expr cos([rad $a])}

set quad_x {
	  45 CCW
	-135 CCW
	 -45 CW
	 135 CW
}

set quad_plus {
	  90 CCW
	 -90 CCW
	   0 CW
	 180 CW
}

set hex_x {
	  90 CW
	 -90 CCW
	 -30 CW
	 150 CCW
	  30 CCW
	-150 CW
}

set hex_plus {
	   0 CW
	 180 CCW
	-120 CW
	  60 CCW
	 -60 CCW
	 120 CW
}

set octa_x {
	  22.5 CW
	-157.5 CW
	  67.5 CCW
	 157.5 CCW
	 -22.5 CCW
	-112.5 CCW
	 -67.5 CW
	 112.5 CW
}

set octa_plus {
	   0 CW
	 180 CW
	  45 CCW
	 135 CCW
	 -45 CCW
	-135 CCW
	 -90 CW
	  90 CW
}

set tables {quad_x quad_plus hex_x hex_plus octa_x octa_plus}

proc factors {a d} { puts [format "\t{ %9.6f, %9.6f, %5.2f }," [rcos [expr $a + 90]] [rcos $a] [expr -$d]]}

foreach table $tables {
	puts [format "const MultirotorMixer::Rotor _config_%s\[\] = {" $table]

	upvar #0 $table angles
	foreach {angle dir} $angles {
		if {$dir == "CW"} {
			set dd -1.0
		} else {
			set dd 1.0
		}
		factors $angle $dd
	}
	puts "};"
}

puts "const MultirotorMixer::Rotor *_config_index\[MultirotorMixer::Geometry::MAX_GEOMETRY\] = {"
foreach table $tables {
	puts [format "\t&_config_%s\[0\]," $table]
}
puts "};"

puts "const unsigned _config_rotor_count\[MultirotorMixer::Geometry::MAX_GEOMETRY\] = {"
foreach table $tables {
	upvar #0 $table angles
	puts [format "\t%u, /* %s */" [expr [llength $angles] / 2] $table]
}
puts "};"
